git-ds 0.9.8 → 0.9.8.1

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.
data/ChangeLog CHANGED
@@ -1,3 +1,7 @@
1
+ 2011-07-30 : mkfs <mkfs@thoughtgang.org>
2
+ * Model#batch is now a wrapper for Database#batch
3
+ * Transaction#perform now executes in batch mode
4
+
1
5
  2011-07-26 : mkfs <mkfs@thoughtgang.org>
2
6
  * Added batch method as an optimization
3
7
 
@@ -223,7 +223,6 @@ See Transaction.
223
223
  return transaction_in_staging(true, &block) if self.staging?
224
224
 
225
225
  begin
226
- self.staging
227
226
  transaction_in_staging(false, &block)
228
227
  ensure
229
228
  self.unstage
@@ -339,6 +338,49 @@ See Database#transaction .
339
338
  rv
340
339
  end
341
340
 
341
+ =begin rdoc
342
+ Execute a block using an in-memory Staging index.
343
+
344
+ This is an optimization. It writes the current index to the git staging index
345
+ on disk, replaces it with an in-memory index that DOES NOT write to the object
346
+ tree on disk, invokes the block, writes the in-memory index to the git staging
347
+ index on disk, then reads the staging index into the repo/database and makes
348
+ it the current index.
349
+
350
+ The idea is to reduce disk writes caused by exec and transaction, which can
351
+ end up being very costly when nested.
352
+
353
+ NOTE: branch-and-merge will fail if in batch mode (TODO: FIX).
354
+ =end
355
+ def batch(&block)
356
+ # NOTE: the use of 'self.staging' is quite important in this method.
357
+
358
+ # write current index to git-staging-index
359
+ idx = self.staging? ? self.staging : nil
360
+ idx.sync if idx
361
+
362
+ # replace current index with an in-mem staging index
363
+ unstage
364
+ self.staging=StageMemIndex.read(self)
365
+
366
+ begin
367
+ yield staging if block_given?
368
+
369
+ rescue Exception => e
370
+ # ensure index is discarded if there is a problem
371
+ unstage
372
+ self.staging if idx
373
+ raise e
374
+ end
375
+
376
+ # write in-mem staging index to git-staging-index
377
+ self.staging.sync
378
+
379
+ # read git-staging-index if appropriate
380
+ unstage
381
+ self.staging if idx
382
+ end
383
+
342
384
  # ----------------------------------------------------------------------
343
385
  private
344
386
 
@@ -203,10 +203,33 @@ This can be used to access index contents created by command-line tools.
203
203
 
204
204
  end
205
205
 
206
+ =begin rdoc
207
+ In-memory staging index.
208
+
209
+ This replaces the StageIndex#build method with a nop, so that the index is
210
+ not written to disk.
211
+
212
+ This is primarily useful in transactions or in methods such as Database#batch.
213
+ Keepin the tree in-memory as long as necessary reduces disk writes and
214
+ speeds up bulk insert/delete operations.
215
+ =end
206
216
  class StageMemIndex < StageIndex
217
+
218
+ =begin rdoc
219
+ Return the sha of the stage index on disk. This DOES NOT synchronize the
220
+ in-memory index with the on-disk index.
221
+ =end
207
222
  def build
208
223
  return @sha
209
224
  end
225
+
226
+ =begin rdoc
227
+ Override StageIndex#sync to not rely on StageIndex#build.
228
+ =end
229
+ def sync
230
+ self.read_tree(self.write)
231
+ @repo.exec_in_git_dir { `git read-tree #{@sha}` }
232
+ end
210
233
  end
211
234
 
212
235
 
@@ -136,34 +136,10 @@ See Database#branch_and_merge.
136
136
  =begin
137
137
  Execute a block using an in-memory Staging index.
138
138
 
139
- This is an optimization. It writes the current index to the git staging index
140
- on disk, replaces it with an in-memory index that DOES NOT write to the object
141
- tree on disk, invokes the block, writes the in-memory index to the git staging
142
- index on disk, then reads the staging index into the repo/database and makes
143
- it the current index.
144
-
145
- The idea is to reduce disk writes caused by exec and transaction, which can
146
- end up being very costly when nested.
147
-
148
- NOTE: branch-and-merge will fail if in batch mode.
139
+ This isjust a wrapper for Database#batch.
149
140
  =end
150
141
  def batch(&block)
151
- # write current index to git-staging-index
152
- idx = (@db.staging?) ? @db.staging : nil
153
- idx.sync if idx
154
-
155
- # replace current index with an in-mem staging index
156
- @db.unstage
157
- @db.staging=StageMemIndex.read(@db)
158
-
159
- yield @db.staging if block_given?
160
-
161
- # write in-mem staging index to git-staging-index
162
- @db.staging.sync
163
-
164
- # read git-staging-index if appropriate
165
- @db.unstage
166
- @db.staging if idx
142
+ @db.batch(&block)
167
143
  end
168
144
 
169
145
  end
@@ -38,25 +38,13 @@ rollback() is called.
38
38
  =end
39
39
  def perform
40
40
  @propagate_exceptions = false # propagation off by default
41
- rv = true
42
- begin
43
- instance_eval(&self.block)
44
- rescue Exception => e
45
- raise e if self.nested
46
- raise e if (not e.kind_of? TransactionRollback) && @propagate_exceptions
47
-
48
- rv = false
49
- end
50
41
 
51
- if rv
52
- self.index.build # required during nesting to support merge_and_branch
53
- if not self.nested
54
- commit
55
- @database.notify
56
- end
57
- end
42
+ return perform_top_level if not self.nested
58
43
 
59
- rv
44
+ instance_eval(&self.block)
45
+ index.build
46
+
47
+ true
60
48
  end
61
49
 
62
50
  =begin rdoc
@@ -76,5 +64,38 @@ Abort the transaction.
76
64
  raise TransactionRollback.new
77
65
  end
78
66
 
67
+ =begin rdoc
68
+ Overrides ExecCmd#index accessor as the Transaction index will change if
69
+ batch mode is used.
70
+ =end
71
+ def index
72
+ database.index
73
+ end
74
+
75
+ private
76
+
77
+ =begin rdoc
78
+ Top-level transactions are performed in batch mode to speed things up.
79
+ =end
80
+ def perform_top_level
81
+ @propagate_exceptions = true
82
+ rv = true
83
+
84
+ begin
85
+ xact = self
86
+ database.batch do
87
+ xact.instance_eval(&xact.block)
88
+ end
89
+
90
+ commit
91
+ @database.notify
92
+ rescue Exception => e
93
+ raise e if (not e.kind_of? TransactionRollback) && @propagate_exceptions
94
+ rv = false
95
+ end
96
+
97
+ rv
98
+ end
99
+
79
100
  end
80
101
  end
@@ -215,8 +215,9 @@ class TC_GitDatabaseTest < Test::Unit::TestCase
215
215
 
216
216
  # test rollback on raise
217
217
  @db.transaction {
218
+ propagate
218
219
  index.add(name1, data1)
219
- raise "ROLLBACK!"
220
+ rollback
220
221
  }
221
222
  blob = index.current_tree./(name1)
222
223
  assert_nil(blob, "transaction raise still created '#{name1}' in staging")
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-ds
3
3
  version: !ruby/object:Gem::Version
4
- hash: 43
4
+ hash: 37
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
9
  - 8
10
- version: 0.9.8
10
+ - 1
11
+ version: 0.9.8.1
11
12
  platform: ruby
12
13
  authors:
13
14
  - TG Community
@@ -15,7 +16,7 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2011-07-26 00:00:00 -04:00
19
+ date: 2011-07-31 00:00:00 -04:00
19
20
  default_executable:
20
21
  dependencies:
21
22
  - !ruby/object:Gem::Dependency