dir2svn 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/dir2svn.gemspec +29 -0
- data/exe/dir2svn +8 -0
- data/lib/dir2svn/version.rb +3 -0
- data/lib/dir2svn.rb +152 -0
- metadata +136 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d4f2af29be30d12a177d853d184732cfe8df5385
|
4
|
+
data.tar.gz: 35c4acf1f766e13b014ba63ce4af761c57a4444d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b2ff9603bb48f1c22efa6d3a28ff388b62e166605641d9d0a9881546b46f6c810309bc00aafe5c2f9341e3f1c7380b5cd0ceb680b57004b33bf998c455317706
|
7
|
+
data.tar.gz: d10adf0fc19a1070968b430c0e3b0a1981e4cace2f19ade59dc87e955fc5dea21b0140e05275ad091c9f0ef0dc5b6f560521dd779c611a6536f4620915aed9b0
|
data/Gemfile
ADDED
data/Rakefile
ADDED
data/dir2svn.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'dir2svn/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "dir2svn"
|
8
|
+
spec.version = Dir2svn::VERSION
|
9
|
+
spec.authors = ["Onno"]
|
10
|
+
spec.email = ["onno@onknows.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Sync a folder to Subversion.}
|
13
|
+
spec.description = %q{Sync a folder to a Subversion working copy. It will make changes to the working copy so that is equal to the source folder}
|
14
|
+
spec.homepage = "https://rubygems.org/profiles/onknows"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
#spec.files = `svn ls -R`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.files = ['exe/dir2svn','lib/dir2svn.rb','lib/dir2svn/version.rb','dir2svn.gemspec','Gemfile','Rakefile']
|
19
|
+
spec.bindir = "exe"
|
20
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.8"
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
26
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
27
|
+
spec.add_development_dependency 'geminabox', '~> 0.12'
|
28
|
+
spec.add_development_dependency 'rubocop', '~> 0.25'
|
29
|
+
end
|
data/exe/dir2svn
ADDED
data/lib/dir2svn.rb
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
require "dir2svn/version"
|
2
|
+
require 'find'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module Dir2svn
|
6
|
+
ERR1 = 'Provide the source and target path before doing a sync'
|
7
|
+
ERR2 = 'Source folder does not exist'
|
8
|
+
ERR3 = 'Target needs to be in a Subversion managed folder'
|
9
|
+
|
10
|
+
# Utility to sync a folder to a Subversion working copy
|
11
|
+
# The working copy folder is the 'target'
|
12
|
+
class Sync
|
13
|
+
attr_accessor :source, :target, :exclude, :do_puts
|
14
|
+
|
15
|
+
def initialize(*args)
|
16
|
+
@source = args[0]
|
17
|
+
@target = args[1]
|
18
|
+
@exclude = args[2] || '.svn,.trashbin,.folder,__generated.txt'
|
19
|
+
@do_puts = args[3] || true
|
20
|
+
end
|
21
|
+
|
22
|
+
def check_source_target_etc
|
23
|
+
fail ERR1 if source.nil? || target.nil?
|
24
|
+
fail ERR2 unless File.exist? source
|
25
|
+
end
|
26
|
+
|
27
|
+
def svn_mkdir_target
|
28
|
+
`svn mkdir --parents \"#{target}\" 2>>svn_mkdir.tmp 1>>svn_mkdir.tmp`
|
29
|
+
svn_mkdir = File.read('svn_mkdir.tmp')
|
30
|
+
File.delete('svn_mkdir.tmp')
|
31
|
+
fail ERR3 if svn_mkdir.include? 'is not a working copy'
|
32
|
+
end
|
33
|
+
|
34
|
+
def run
|
35
|
+
check_source_target_etc
|
36
|
+
svn_mkdir_target
|
37
|
+
results = Dir2svn.sync_paths(source, target, exclude, do_puts)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def sync_paths(src, dest, exclude, do_puts)
|
42
|
+
src = File.expand_path(src) + '/'
|
43
|
+
dest = File.expand_path(dest) + '/'
|
44
|
+
results = nil
|
45
|
+
# First files, then folders,
|
46
|
+
# as the processing of files can also sync folders
|
47
|
+
results = Dir2svn.sync_file_paths(src, dest, exclude, do_puts)
|
48
|
+
Dir2svn.sync_folder_paths(src, dest, exclude, do_puts)
|
49
|
+
results
|
50
|
+
end
|
51
|
+
module_function :sync_paths
|
52
|
+
|
53
|
+
# See SvnRepository#sync_paths
|
54
|
+
def sync_file_paths(src, dest, exclude, do_puts)
|
55
|
+
fls_dest = Dir2svn.find_files(dest, exclude, do_puts).collect { |p| p.sub(dest, '') }
|
56
|
+
fls_src = Dir2svn.find_files(src, exclude, do_puts).collect { |p| p.sub(src, '') }
|
57
|
+
fls_d = fls_dest - fls_src # deleted: in DEST but not (anymore) in SRC
|
58
|
+
fls_a = fls_src - fls_dest # added: in SRC but not (yet) in SRC
|
59
|
+
fls_f = fls_src - fls_a # found: in SRC and DEST: everything in SRC that we didn't add
|
60
|
+
fls_u = [] # updated
|
61
|
+
fls_e = [] # equal
|
62
|
+
|
63
|
+
# Update files
|
64
|
+
fls_f.collect do |p| # update files
|
65
|
+
p1 = File.expand_path(p, src) # new version
|
66
|
+
p0 = File.expand_path(p, dest) # existing version
|
67
|
+
if File.identical?(p1, p0)
|
68
|
+
fls_e << p
|
69
|
+
else
|
70
|
+
FileUtils.cp(p1, p0)
|
71
|
+
fls_u << p
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Add files
|
76
|
+
fls_a.each do |p|
|
77
|
+
p1 = File.expand_path(p, src) # new version
|
78
|
+
p0 = File.expand_path(p, dest)
|
79
|
+
unless File.exist?(File.dirname(p0)) # create parent dir of new file unless it exists
|
80
|
+
# self.makedir_parents(File.dirname(p0)) unless File.exists?(File.dirname(p0))
|
81
|
+
cmd = "svn mkdir --parents \"#{File.dirname(p0)}\""
|
82
|
+
out = `#{cmd}`
|
83
|
+
puts "#{cmd}\n#{out}" if do_puts
|
84
|
+
end
|
85
|
+
FileUtils.cp(p1, p0)
|
86
|
+
cmd = "svn add \"#{p0}\""
|
87
|
+
out = `#{cmd}`
|
88
|
+
puts "#{cmd}\n#{out}" if do_puts
|
89
|
+
end
|
90
|
+
|
91
|
+
# delete files
|
92
|
+
fls_d.each do |p|
|
93
|
+
p0 = File.expand_path(p, dest)
|
94
|
+
cmd = "svn rm \"#{p0}\""
|
95
|
+
out = `#{cmd}`
|
96
|
+
puts "#{cmd}\n#{out}" if do_puts
|
97
|
+
end
|
98
|
+
{ deleted: fls_d, added: fls_a, updated: fls_u, equal: fls_e }
|
99
|
+
end
|
100
|
+
module_function :sync_file_paths
|
101
|
+
|
102
|
+
# See SvnRepository#sync_paths
|
103
|
+
def sync_folder_paths(src, dest, exclude, do_puts)
|
104
|
+
fldrs_src = Dir2svn.find_folders(src, exclude, do_puts).collect { |p| p.sub(src, '') }
|
105
|
+
fldrs_dest = Dir2svn.find_folders(dest, exclude, do_puts).collect { |p| p.sub(dest, '') }
|
106
|
+
fldrs_d = (fldrs_dest - fldrs_src) # deleted folders: see deleted files
|
107
|
+
fldrs_a = (fldrs_src - fldrs_dest) # add folders: see added files
|
108
|
+
fldrs_d.each do |p| # deleted folders
|
109
|
+
p0 = File.expand_path(p, dest)
|
110
|
+
next unless File.exist?(p0)
|
111
|
+
cmd = "svn rm \"#{p0}\""
|
112
|
+
out = `#{cmd}`
|
113
|
+
puts "#{cmd}\n#{out}" if do_puts
|
114
|
+
end
|
115
|
+
fldrs_a.each do |p| # added folders (must be empty, not very useful but..)
|
116
|
+
p0 = File.expand_path(p, dest)
|
117
|
+
cmd = "svn mkdir --parents \"#{p0}\""
|
118
|
+
out = `#{cmd}`
|
119
|
+
puts "#{cmd}\n#{out}" if do_puts
|
120
|
+
end
|
121
|
+
end
|
122
|
+
module_function :sync_folder_paths
|
123
|
+
|
124
|
+
def find_files(path, exclude, do_puts)
|
125
|
+
Dir2svn.find_paths(path, exclude, do_puts)[:files]
|
126
|
+
end
|
127
|
+
module_function :find_files
|
128
|
+
|
129
|
+
def find_folders(path, exclude, do_puts)
|
130
|
+
Dir2svn.find_paths(path, exclude, do_puts)[:folders]
|
131
|
+
end
|
132
|
+
module_function :find_folders
|
133
|
+
|
134
|
+
def find_paths(path, exclude, _do_puts)
|
135
|
+
fls = []
|
136
|
+
fldrs = []
|
137
|
+
Find.find(path) do |p|
|
138
|
+
if FileTest.directory?(p)
|
139
|
+
if exclude.include?(File.basename(p))
|
140
|
+
Find.prune # Don't look any further into this directory.
|
141
|
+
else
|
142
|
+
fldrs << p
|
143
|
+
next
|
144
|
+
end
|
145
|
+
else # ignore .folder files
|
146
|
+
fls << p unless exclude.include?(File.basename(p))
|
147
|
+
end
|
148
|
+
end
|
149
|
+
{ files: fls, folders: fldrs }
|
150
|
+
end
|
151
|
+
module_function :find_paths
|
152
|
+
end
|
metadata
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dir2svn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Onno
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.8'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.10'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.10'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: geminabox
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.12'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.12'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.25'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.25'
|
97
|
+
description: Sync a folder to a Subversion working copy. It will make changes to the
|
98
|
+
working copy so that is equal to the source folder
|
99
|
+
email:
|
100
|
+
- onno@onknows.com
|
101
|
+
executables:
|
102
|
+
- dir2svn
|
103
|
+
extensions: []
|
104
|
+
extra_rdoc_files: []
|
105
|
+
files:
|
106
|
+
- Gemfile
|
107
|
+
- Rakefile
|
108
|
+
- dir2svn.gemspec
|
109
|
+
- exe/dir2svn
|
110
|
+
- lib/dir2svn.rb
|
111
|
+
- lib/dir2svn/version.rb
|
112
|
+
homepage: https://rubygems.org/profiles/onknows
|
113
|
+
licenses:
|
114
|
+
- MIT
|
115
|
+
metadata: {}
|
116
|
+
post_install_message:
|
117
|
+
rdoc_options: []
|
118
|
+
require_paths:
|
119
|
+
- lib
|
120
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
requirements: []
|
131
|
+
rubyforge_project:
|
132
|
+
rubygems_version: 2.4.6
|
133
|
+
signing_key:
|
134
|
+
specification_version: 4
|
135
|
+
summary: Sync a folder to Subversion.
|
136
|
+
test_files: []
|