Skip to content

Instantly share code, notes, and snippets.

@timfall
Last active December 16, 2015 08:39
Show Gist options
  • Save timfall/5407500 to your computer and use it in GitHub Desktop.
Save timfall/5407500 to your computer and use it in GitHub Desktop.
#!/usr/bin/ruby
require 'json'
require 'oauth'
#require '../lib/OauthFigsharesync'
#require '../lib/FigshareClasses'
workingdir = "~/.figsharesync/"
consumerkey
consumersecret
accesstoken
accesstokensecret
localarticlelist
#First run setup
absworkingdir = File.expand_path(workingdir)
if File.exist?("#{absworkingdir}/FirstRun.lock")
break
else
puts "This appears to be the first run of FigShare Sync. We'll setup a few things."
print "Where would you like to store settings and files? [~./figsharesync]: "
@input = gets.chomp
if @input != nil
workingdir = @input
absworkingdir = File.expand_path(workingdir)
else
break
end
print "Please enter OAuth consumer key: "
consumerkey = gets.chomp
print "Please enter OAuth consumer key secret: "
consumersecret = gets.chomp
print "Please enter OAuth access token: "
accesstoken = gets.chomp
print "Please enter OAuth access token secret: "
accesstokensecret = gets.chomp
puts "Great! we'll get running now..."
File.new("#{absworkingdir}/FirstRun.lock", "r")
end
#oauth authenticate
auth = OauthFighshare.new(consumerkey, consumersecret, accesstoken, accesstokensecret)
if auth.header (v1/my_data/articles) == Net::HTTPUnauthorized
puts "Figshare returned #{auth.header (v1/my_data/articles)}"
end
puts "Successfully authenticated"
#Create article database and populate from local sources
if File.exists?("#{absworkingdir}/localdb.json")
puts "Local database detected, populating from there"
ldb = JSON.parse("#{absworkingdir}/localdb.json")
@i = ldb['count']
for @i.times do
localarticlelist[i] = Article.new(ldb[i].name, "#{absworkingdir}/localdb/#{ldb[i].name}", ldb[i].id, ldb[i].title, ldb[i].description, ldb[i].defined_type)
done
puts "Done populating the local list from local database"
else
puts "No local database detected, grabbing one from the server"
ldb = auth.get('v1/my_data/articles')
ldb = JSON.parse(ldb.body)
@local = File.new("#{absworkingdir}/localdb.json", "w")
@local << ldb
i = ldb['count']
for i.times do
localarticlelist[i] = Article.new(ldb[i].name, "#{absworkingdir}/localdb/#{ldb[i].name}", ldb[i].id, ldb[i].title, ldb[i].description, ldb[i].defined_type)
done
puts "Local database file created and populated from server"
done
#Compare local and remote databses for differences
rdb = auth.get('v1/my_data/articles')
rdb = JSON.parse(rdb.body)
i = rdb[count]
r = ldb[count]
for i.times do
remotearticlelist[i] = Article.new(rdb[i].name, "v1/my_data/articles/#{ldb[i].name}", rdb[i].id, rdb[i].title, rdb[i].description, rdb[i].defined_type)
done
for i.times do
for r.times do
@remotehash = remotearticlelist[i].hash
@localhash = localarticlelist[r].hash
if rdb[i].id == ldb[r].id
if @remotehash != @localhash
puts "Hash mismatch! #{remotearticlelist[i].name} and #{localarticlelist[r].name} do not match"
if File.mtime(remotearticlelist[i].path) >= File.mtime(localarticlelist[r].path)#If remote version is newer than local
File.new('#{absworkingdir}/localdb/#{remotearticlelist[i].name}', "w") = auth.get(remotearticlelist[i].path)#download remote version
localarticlelist[r] = Article.new(rdb[i].name, "#{absworkingdir}/localdb/#{rbd[i].name}", rbd[i].id)#create new local article entry
download = auth.get(remotearticlelist[i].path)
download = JSON.parse(download.body)
@local = File.read("#{absworkingdir}/localdb.json")
@local.gsub(/pattern/) { matchmatchmatch } #replace entry in localdb.json
end
elsif File.mtime(remotearticlelist[i].path) <= File.mtime(localarticlelist[r].path)#If local version is newer than remote
localfile = JSON.pretty_generate('Title' => localarticlelist[r].title, 'description' => localarticlelist[r].description, 'defined_type' => localarticlelist[r].defined_type)#generate a json list from the object
auth.post('v1/my_data/articles/', localfile, {"Content-Type" => "application/json"})#upload json list
end
end
end
next
done
done
puts "All hashes match"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment