dit 0.1.1 → 0.2

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dit.rb +96 -103
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 74c6480d2fc0399121019b398353cea7868f8005
4
- data.tar.gz: f541e05d5e8c8f49d94e41a672579eb2c7ce4764
3
+ metadata.gz: 40c3229cc364f6d858c3ff061c564eb1009fa661
4
+ data.tar.gz: d60799dfbfe44a94c0d478b8e58b09d7e653df00
5
5
  SHA512:
6
- metadata.gz: 389cada647157c1d25eb241c29c24c5bdb4192ad44a50cb7046402fc7420d884413652e1afb5916d781b05b05b85b4493dbc894089fceccf1f5443f8e5b16744
7
- data.tar.gz: 78329737e0e2933c4af3e2f9675e540c9bd17075d320458fa1842dd291702d016b10e194ddc7ae534e4834cd726e9e2ff634f602c65b1713e7eb1502fee675fd
6
+ metadata.gz: 755aae9e97a7139012a64e04f5efe9a44922af945f4ef322a56a94b0da3a21c39864a97333f315e221f72b515489e82f3b70b888cccd0aa87077df0ba913f65f
7
+ data.tar.gz: b0bc69bde3916ff81847a53830a8e340c722c67cd8cf7c5c78250c4001419552587a46989a0816c9bfceb49006e5ec228007019e0c94bc08ed5ba160c270dd1f
data/lib/dit.rb CHANGED
@@ -6,59 +6,53 @@ require 'fileutils'
6
6
 
7
7
  class Dit
8
8
  def self.init
9
- if(Dir.exist?(".dit"))
10
- puts "This is already a dit repo, so all we have to do is symlink to home."
11
- symlink_all
12
- hook
9
+ if OS.windows?
10
+ puts "This is a windows system, and dit does not support windows."
11
+ puts "See vulpino/dit issue #1 if you have a potential solution."
13
12
  return
14
- elsif(Dir.exist?(".git"))
15
- repo = Git.open(Dir.getwd)
16
- else
17
- repo = Git.init(Dir.getwd)
18
- puts "Initialized empty Git repository in #{File.join(Dir.getwd, ".git")}"
19
13
  end
20
14
 
21
- # Make a .dit dir and a settings hash to be exported to a file in dit dir
22
- Dir.mkdir(".dit")
23
- settings = {}
24
-
25
- # create a .gitignore to ignore the os_dotfiles dir
26
- File.open(".gitignore", "a") do |f|
27
- f.write ".dit/os_dotfiles/"
28
- f.write "\n"
29
- f.write ".dit/local_settings.json"
30
- end
31
-
32
- # Write our changes to a JSON file in the dit dir
33
- File.open(File.join(".dit", "settings.json"), "a") do |f|
34
- f.write settings.to_json if settings
15
+ if Dir.exist?(".git")
16
+ puts "Dit has detected an existing git repo, and will initialize it to " +
17
+ "populate your ~ directory with symlinks."
18
+ puts "Please confirm this by typing y, or anything else to cancel."
19
+ return unless gets.chomp! === 'y'
20
+ symlink_all
21
+ else
22
+ Git.init(Dir.getwd)
23
+ puts "Initialized empty Git repository in #{File.join(Dir.getwd, ".git")}"
35
24
  end
36
-
37
- repo.add(".dit/settings.json")
38
- repo.add(".gitignore")
39
- repo.commit("Dit inital commit")
40
-
41
- clone_os_dotfiles
42
25
  hook
43
-
44
- puts "Initialized empty Dit repository in #{File.join(Dir.getwd, ".dit")})"
26
+ puts "Dit was successfully hooked into .git/hooks."
45
27
  end
46
28
 
47
29
  def self.hook
48
- return unless Dir.exist?(".dit")
49
30
  Dir.chdir(File.join(".git", "hooks")) do
50
- p Dir.getwd
51
- FileUtils.rm_rf Dir.glob("*")
52
- File.open(("post-commit"), "a") do |f|
53
- f.write "#!/usr/bin/env ./.git/hooks/force-ruby\n"
54
- f.write "require 'dit'\n"
55
- f.write "Dit.symlink_unlinked\n"
31
+ # The following check for the existence of post-commit or post-merge hooks
32
+ # and will not interfere with them if they exist and do not use bash.
33
+ append_to_post_commit, append_to_post_merge, cannot_post_commit,
34
+ cannot_post_merge = detect_existing_hooks
35
+
36
+ unless cannot_post_commit
37
+ File.open("post-commit", "a") do |f|
38
+ f.write "#!/usr/bin/env bash\n" unless append_to_post_commit
39
+ f.write "( exec ./.git/hooks/dit )\n"
40
+ end
56
41
  end
57
- File.open(("post-merge"), "a") do |f|
42
+
43
+ unless cannot_post_merge
44
+ File.open("post-merge", "a") do |f|
45
+ f.write "#!/usr/bin/env bash\n" unless append_to_post_merge
46
+ f.write "( exec ./.git/hooks/dit )\n"
47
+ end
48
+ end
49
+
50
+ File.open("dit", "a") do |f|
58
51
  f.write "#!/usr/bin/env ./.git/hooks/force-ruby\n"
59
52
  f.write "require 'dit'\n"
60
53
  f.write "Dit.symlink_unlinked\n"
61
54
  end
55
+
62
56
  # The following lines are because git hooks do this weird thing
63
57
  # where they prepend /usr/bin to the path and a bunch of other stuff
64
58
  # meaning git hooks will use /usr/bin/ruby instead of any ruby
@@ -67,11 +61,11 @@ class Dit
67
61
  ruby_path = `which ruby`
68
62
  if(ruby_path != "/usr/bin/ruby")
69
63
  ruby_folder = File.dirname(ruby_path)
70
- File.open(("force-ruby"), "a") do |f|
64
+ File.open("force-ruby", "a") do |f|
71
65
  f.write "#!/usr/bin/env bash\n"
72
66
  f.write "set -e\n"
73
67
  if ENV['RBENV_ROOT']
74
- # Use Rbenv's shims
68
+ # Use Rbenv's shims instead of directly going to ruby bin
75
69
  # By the way, if anyone has particular PATHs I should use for
76
70
  # RVM or chruby, please let me know!
77
71
  f.write "PATH=#{File.join(ENV['RBENV_ROOT'], "shims")}:$PATH\n"
@@ -80,89 +74,83 @@ class Dit
80
74
  end
81
75
  f.write "exec ruby \"$@\"\n"
82
76
  end
77
+ else
78
+ File.open("force-ruby", "a") do |f|
79
+ f.write "#!/usr/bin/env bash\n"
80
+ f.write "exec ruby \"$@\"\n"
81
+ end
83
82
  end
84
-
85
- FileUtils.chmod '+x', %w(post-commit post-merge force-ruby)
83
+ # Make sure they're executable
84
+ FileUtils.chmod '+x', %w(post-commit post-merge dit force-ruby)
86
85
  end
87
86
  end
88
87
 
89
- def self.clone_os_dotfiles
90
- # OS Specific Dotfiles Eventually TM
91
- file_url = "file:///" + File.absolute_path(Dir.getwd)
92
- Dir.chdir(".dit") do
93
- os_dotfiles = Git.clone(file_url, "os_dotfiles")
94
- os_dotfiles.branch("master").checkout
88
+ def self.symlink_list(list)
89
+ list.each do |f|
90
+ wd_f = File.absolute_path f
91
+ home_f = File.absolute_path(f).gsub(Dir.getwd, Dir.home)
92
+ symlink wd_f, home_f
95
93
  end
96
94
  end
97
95
 
96
+ def self.symlink_unlinked
97
+ symlink_list `git show --pretty="format:" --name-only HEAD`.split("\n")
98
+ end
99
+
98
100
  def self.symlink_all
99
- Dir.chdir(File.join(repo_name, ".dit", "os_dotfiles")) do
100
- Find.find('.') do |d|
101
- if File.directory?(d)
102
- Dir.mkdir(File.join(Dir.home, d.split['os_dotfiles'][1]))
103
- Dir.entries(d).each do |f|
104
- next if (f === '.' || f === '..')
105
- abs_f = File.absolute_path(f)
106
- rel_f = File.join(Dir.home, abs_f.split("os_dotfiles")[1])
107
- File.symlink(abs_f, rel_f) unless File.exists?(rel_f)
108
- end
109
- end
110
- end
111
- end
101
+ current_branch = `git rev-parse --abbrev-ref HEAD`
102
+ symlink_list `git ls-tree -r #{current_branch} --name-only`.split("\n")
112
103
  end
113
104
 
114
- def self.symlink_unlinked
115
- settings = nil
105
+ private
106
+
107
+ def self.repo
108
+ Git.open(Dir.getwd)
109
+ end
110
+
111
+ def self.symlink(a, b)
116
112
  begin
117
- settings = JSON.parse File.open(
118
- File.join(Dir.getwd, ".dit", "local_settings.json"), "r").read.close
113
+ File.symlink(a, b)
119
114
  rescue
120
- settings = {
121
- symlinked: []
122
- }
115
+ puts "Failed to symlink #{a} to #{b}"
123
116
  end
117
+ end
124
118
 
125
- Dir.chdir(".dit") do
126
- Dir.chdir("os_dotfiles") do
127
- Git.open(Dir.getwd).pull
128
- os_changed_files = `git show --pretty="format:" --name-only HEAD`
129
- os_changed_files.split('\n').each do |file|
130
- file.strip! # strip newlines
131
- next if os_list.include?(file.split('.').pop())
132
- next if settings[:symlinked].include?(file)
133
- next if file.include?(".dit")
134
- File.symlink(
135
- File.absolute_path(file),
136
- File.absolute_path(File.join(Dir.home, file)))
137
- settings[:symlinked] << file
138
- end
119
+ def self.detect_existing_hooks
120
+ post_commit_hook_exists = File.exist?("post-commit")
121
+ post_merge_hook_exists = File.exist?("post-merge")
122
+
123
+ cannot_post_commit, append_to_post_commit = false
124
+ cannot_post_merge, append_to_post_merge = false
125
+
126
+ if post_commit_hook_exists
127
+ if `cat post-commit`.include?("#!/usr/bin/env bash")
128
+ puts "You have post-commit hooks already that use bash, so we'll " +
129
+ "append ourselves to the file."
130
+ append_to_post_commit = true
131
+ else
132
+ puts "You have post-commit hooks that use some foreign language, " +
133
+ "so we won't interfere, but we can't hook in there."
134
+ cannot_post_commit = true
139
135
  end
140
136
  end
141
137
 
142
- File.open(File.join(Dir.getwd, ".dit", "local_settings.json"), "w+") do |f|
143
- f.truncate 0
144
- f.write settings.to_json
138
+ if post_merge_hook_exists
139
+ if `cat post-merge`.include?("#!/usr/bin/env bash")
140
+ puts "You have post-merge hooks already that use bash, so we'll " +
141
+ "append ourselve to the file."
142
+ append_to_post_merge = true
143
+ else
144
+ puts "You have post-merge hooks that use some not-bash language, " +
145
+ "so we won't interfere, but we can't hook in there."
146
+ cannot_post_merge = true
147
+ end
145
148
  end
146
- end
147
149
 
148
- private
149
-
150
- def self.repo
151
- Git.open(Dir.getwd)
150
+ [append_to_post_commit, append_to_post_merge,
151
+ cannot_post_commit, cannot_post_merge]
152
152
  end
153
153
 
154
- def self.os_list
155
- [
156
- 'windows',
157
- 'osx',
158
- 'arch',
159
- 'fedora',
160
- 'debian',
161
- 'ubuntu',
162
- 'slack',
163
- 'bsd'
164
- ]
165
- end
166
154
  end
167
155
 
168
156
  class DitCMD < Thor
@@ -170,4 +158,9 @@ class DitCMD < Thor
170
158
  def init
171
159
  Dit.init
172
160
  end
161
+
162
+ desc "rehash", "Manually symlink everything in case a git hook didn't run."
163
+ def rehash
164
+ Dit.symlink_all
165
+ end
173
166
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: '0.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyle Fahringer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-14 00:00:00.000000000 Z
11
+ date: 2015-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor