... | ... |
@@ -71,7 +71,7 @@ sub startup { |
71 | 71 |
my $dbi = DBIx::Custom->connect( |
72 | 72 |
dsn => "dbi:SQLite:database=$db_file", |
73 | 73 |
connector => 1, |
74 |
- option => {sqlite_unicode => 1} |
|
74 |
+ option => {sqlite_unicode => 1, sqlite_use_immediate_transaction => 1} |
|
75 | 75 |
); |
76 | 76 |
$self->dbi($dbi); |
77 | 77 |
|
... | ... |
@@ -81,7 +81,8 @@ sub startup { |
81 | 81 |
# Model |
82 | 82 |
my $models = [ |
83 | 83 |
{table => 'user', primary_key => 'id'}, |
84 |
- {table => 'project', primary_key => ['user_id', 'name']} |
|
84 |
+ {table => 'project', primary_key => ['user_id', 'name']}, |
|
85 |
+ {table => 'number', primary_key => 'key'} |
|
85 | 86 |
]; |
86 | 87 |
$dbi->create_model($_) for @$models; |
87 | 88 |
|
... | ... |
@@ -181,22 +181,32 @@ sub _create_user_dir { |
181 | 181 |
sub exists_project { shift->_exists_project(@_) } |
182 | 182 |
|
183 | 183 |
sub fork_project { |
184 |
- my ($self, $login_user, $user, $project) = @_; |
|
184 |
+ my ($self, $user, $original_user, $project) = @_; |
|
185 | 185 |
|
186 |
+ # DBI |
|
186 | 187 |
my $dbi = $self->app->dbi; |
187 | 188 |
|
189 |
+ # Fork project |
|
188 | 190 |
my $error; |
189 | 191 |
eval { |
190 | 192 |
$dbi->connector->txn(sub { |
191 | 193 |
|
194 |
+ # Original project id |
|
195 |
+ my $original_pid = $dbi->model('project') |
|
196 |
+ ->select('original_pid', id => [$original_user, $project])->value; |
|
197 |
+ |
|
198 |
+ croak "Can't get original project id" |
|
199 |
+ unless defined $original_pid && $original_pid > 0; |
|
200 |
+ |
|
192 | 201 |
# Create project |
193 | 202 |
eval { |
194 | 203 |
$self->_create_project( |
195 |
- $login_user, |
|
204 |
+ $user, |
|
196 | 205 |
$project, |
197 | 206 |
{ |
198 |
- original_user => $user, |
|
199 |
- original_project => $project |
|
207 |
+ original_user => $original_user, |
|
208 |
+ original_project => $project, |
|
209 |
+ original_pid => $original_pid |
|
200 | 210 |
} |
201 | 211 |
); |
202 | 212 |
}; |
... | ... |
@@ -204,7 +214,7 @@ sub fork_project { |
204 | 214 |
|
205 | 215 |
# Create repository |
206 | 216 |
eval { |
207 |
- $self->_fork_rep($user, $project, $login_user, $project); |
|
217 |
+ $self->_fork_rep($original_user, $project, $user, $project); |
|
208 | 218 |
}; |
209 | 219 |
croak $error = $@ if $@; |
210 | 220 |
}); |
... | ... |
@@ -318,14 +328,15 @@ EOS |
318 | 328 |
my $project_columns = [ |
319 | 329 |
"default_branch not null default 'master'", |
320 | 330 |
"original_user not null default ''", |
321 |
- "original_project not null default ''" |
|
331 |
+ "original_project not null default ''", |
|
332 |
+ "original_pid integer not null default 0" |
|
322 | 333 |
]; |
323 | 334 |
for my $column (@$project_columns) { |
324 | 335 |
eval { $dbi->execute("alter table project add column $column") }; |
325 | 336 |
} |
326 | 337 |
|
327 | 338 |
# Check project table |
328 |
- eval { $dbi->select([qw/default_branch original_user original_project/], table => 'project') }; |
|
339 |
+ eval { $dbi->select([qw/default_branch original_user original_project original_pid/], table => 'project') }; |
|
329 | 340 |
if ($@) { |
330 | 341 |
my $error = "Can't create project table properly: $@"; |
331 | 342 |
$self->app->log->error($error); |
... | ... |
@@ -377,8 +388,19 @@ sub _create_project { |
377 | 388 |
my ($self, $user, $project, $params) = @_; |
378 | 389 |
$params ||= {}; |
379 | 390 |
|
391 |
+ # DBI |
|
392 |
+ my $dbi = $self->app->dbi; |
|
393 |
+ |
|
380 | 394 |
# Create project |
381 |
- $self->app->dbi->model('project')->insert($params, id => [$user, $project]); |
|
395 |
+ $dbi->connector->txn(sub { |
|
396 |
+ unless (defined $params->{original_pid}) { |
|
397 |
+ my $number = $dbi->model('number')->select('value', where => {key => 'original_pid'})->value; |
|
398 |
+ $number++; |
|
399 |
+ $dbi->model('number')->update({value => $number}, where => {key => 'original_pid'}); |
|
400 |
+ $params->{original_pid} = $number; |
|
401 |
+ } |
|
402 |
+ $dbi->model('project')->insert($params, id => [$user, $project]); |
|
403 |
+ }); |
|
382 | 404 |
} |
383 | 405 |
|
384 | 406 |
sub _create_rep { |
... | ... |
@@ -25,7 +25,7 @@ |
25 | 25 |
% } |
26 | 26 |
|
27 | 27 |
<ul class="breadcrumb" style="margin-top:10px"> |
28 |
- <li><a href="<%= url_for('/') %>">Home</a></li> |
|
28 |
+ <li><a href="<%= url_for('/') %>"><i class="icon-home"></i></a></li> |
|
29 | 29 |
/ |
30 | 30 |
<li><a href="<%= url_for("/$user") %>"><%= $user %></a></li> |
31 | 31 |
</ul> |