Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
591cca95
提交
591cca95
authored
4月 15, 2015
作者:
Jeromy
提交者:
Juan Batiz-Benet
4月 20, 2015
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
remove migrations code from go-ipfs, in favor of fs-repo-migrations repo
上级
c419a489
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
0 行增加
和
373 行删除
+0
-373
main.go
repo/fsrepo/migrations/0-to-1/main.go
+0
-69
main.go
repo/fsrepo/migrations/1-to-2/main.go
+0
-248
mfsr.go
repo/fsrepo/migrations/mfsr.go
+0
-56
没有找到文件。
repo/fsrepo/migrations/0-to-1/main.go
deleted
100644 → 0
浏览文件 @
c419a489
package
main
import
(
"fmt"
"os"
"strings"
migrate
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-migrate"
mfsr
"github.com/ipfs/go-ipfs/repo/fsrepo/migrations"
)
type
migration
struct
{
}
// Version is the int version number. This could be a string
// in future versions
func
(
m
migration
)
Versions
()
string
{
return
"0-to-1"
}
// Reversible returns whether this migration can be reverted.
// Endeavor to make them all reversible. This is here only to warn users
// in case this is not the case.
func
(
m
migration
)
Reversible
()
bool
{
return
true
}
// Apply applies the migration in question.
// This migration merely adds a version file.
func
(
m
migration
)
Apply
(
opts
migrate
.
Options
)
error
{
repo
:=
mfsr
.
RepoPath
(
opts
.
Path
)
// first, check if there is a version file.
// if there is, bail out.
if
v
,
err
:=
repo
.
Version
();
err
==
nil
{
return
fmt
.
Errorf
(
"repo at %s is version %s (not 0)"
,
opts
.
Path
,
v
)
}
else
if
!
strings
.
Contains
(
err
.
Error
(),
"no version file in repo"
)
{
return
err
}
// add the version file
if
err
:=
repo
.
WriteVersion
(
"1"
);
err
!=
nil
{
return
err
}
return
nil
}
// Revert un-applies the migration in question. This should be best-effort.
// Some migrations are definitively one-way. If so, return an error.
func
(
m
migration
)
Revert
(
opts
migrate
.
Options
)
error
{
repo
:=
mfsr
.
RepoPath
(
opts
.
Path
)
if
err
:=
repo
.
CheckVersion
(
"1"
);
err
!=
nil
{
return
err
}
// remove the version file
if
err
:=
os
.
Remove
(
repo
.
VersionFile
());
err
!=
nil
{
return
err
}
return
nil
}
func
main
()
{
m
:=
migration
{}
migrate
.
Main
(
&
m
)
}
repo/fsrepo/migrations/1-to-2/main.go
deleted
100644 → 0
浏览文件 @
c419a489
package
main
import
(
"encoding/json"
"fmt"
"os"
"path"
"strings"
dstore
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
flatfs
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/flatfs"
leveldb
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/leveldb"
dsq
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/query"
migrate
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-migrate"
mfsr
"github.com/ipfs/go-ipfs/repo/fsrepo/migrations"
context
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
)
var
_
=
context
.
Background
const
peerKeyName
=
"peer.key"
type
migration
struct
{}
func
(
m
migration
)
Versions
()
string
{
return
"1-to-2"
}
func
(
m
migration
)
Reversible
()
bool
{
return
true
}
func
(
m
migration
)
Apply
(
opts
migrate
.
Options
)
error
{
repo
:=
mfsr
.
RepoPath
(
opts
.
Path
)
if
err
:=
repo
.
CheckVersion
(
"1"
);
err
!=
nil
{
return
err
}
// 1) run some sanity checks to make sure we should even bother
err
:=
sanityChecks
(
opts
)
if
err
!=
nil
{
return
err
}
// 2) Transfer blocks out of leveldb into flatDB
err
=
transferBlocksToFlatDB
(
opts
.
Path
)
if
err
!=
nil
{
return
err
}
// 3) move ipfs path from .go-ipfs to .ipfs
newpath
,
err
:=
moveIpfsDir
(
opts
.
Path
)
if
err
!=
nil
{
return
err
}
// 4) Update version number
repo
=
mfsr
.
RepoPath
(
newpath
)
err
=
repo
.
WriteVersion
(
"2"
)
if
err
!=
nil
{
return
err
}
return
nil
}
func
(
m
migration
)
Revert
(
opts
migrate
.
Options
)
error
{
repo
:=
mfsr
.
RepoPath
(
opts
.
Path
)
if
err
:=
repo
.
CheckVersion
(
"2"
);
err
!=
nil
{
return
err
}
// 1) Move directory back to .go-ipfs
npath
,
err
:=
reverseIpfsDir
(
opts
.
Path
)
if
err
!=
nil
{
return
err
}
// 2) move blocks back from flatfs to leveldb
err
=
transferBlocksFromFlatDB
(
npath
)
if
err
!=
nil
{
return
err
}
// 3) change version number back down
repo
=
mfsr
.
RepoPath
(
npath
)
err
=
repo
.
WriteVersion
(
"1"
)
if
err
!=
nil
{
return
err
}
return
nil
}
// sanityChecks performs a set of tests to make sure the migration will go
// smoothly
func
sanityChecks
(
opts
migrate
.
Options
)
error
{
npath
:=
strings
.
Replace
(
opts
.
Path
,
".go-ipfs"
,
".ipfs"
,
1
)
// make sure we can move the repo from .go-ipfs to .ipfs
err
:=
os
.
Mkdir
(
npath
,
0777
)
if
err
!=
nil
{
return
err
}
// we can? good, remove it now
err
=
os
.
Remove
(
npath
)
if
err
!=
nil
{
// this is weird... not worth continuing
return
err
}
return
nil
}
func
transferBlocksToFlatDB
(
repopath
string
)
error
{
ldbpath
:=
path
.
Join
(
repopath
,
"datastore"
)
ldb
,
err
:=
leveldb
.
NewDatastore
(
ldbpath
,
nil
)
if
err
!=
nil
{
return
err
}
blockspath
:=
path
.
Join
(
repopath
,
"blocks"
)
err
=
os
.
Mkdir
(
blockspath
,
0777
)
if
err
!=
nil
&&
!
os
.
IsExist
(
err
)
{
return
err
}
fds
,
err
:=
flatfs
.
New
(
blockspath
,
4
)
if
err
!=
nil
{
return
err
}
return
transferBlocks
(
ldb
,
fds
,
"/b/"
,
""
)
}
func
transferBlocksFromFlatDB
(
repopath
string
)
error
{
ldbpath
:=
path
.
Join
(
repopath
,
"datastore"
)
blockspath
:=
path
.
Join
(
repopath
,
"blocks"
)
fds
,
err
:=
flatfs
.
New
(
blockspath
,
4
)
if
err
!=
nil
{
return
err
}
ldb
,
err
:=
leveldb
.
NewDatastore
(
ldbpath
,
nil
)
if
err
!=
nil
{
return
err
}
err
=
transferBlocks
(
fds
,
ldb
,
""
,
"/b/"
)
if
err
!=
nil
{
return
err
}
// Now remove the blocks directory
err
=
os
.
RemoveAll
(
blockspath
)
if
err
!=
nil
{
return
err
}
return
nil
}
func
transferBlocks
(
from
,
to
dstore
.
Datastore
,
fpref
,
tpref
string
)
error
{
q
:=
dsq
.
Query
{
Prefix
:
fpref
,
KeysOnly
:
true
}
res
,
err
:=
from
.
Query
(
q
)
if
err
!=
nil
{
return
err
}
fmt
.
Println
(
"Starting query"
)
for
result
:=
range
res
.
Next
()
{
nkey
:=
fmt
.
Sprintf
(
"%s%s"
,
tpref
,
result
.
Key
[
len
(
fpref
)
:
])
fkey
:=
dstore
.
NewKey
(
result
.
Key
)
val
,
err
:=
from
.
Get
(
fkey
)
if
err
!=
nil
{
return
err
}
err
=
to
.
Put
(
dstore
.
NewKey
(
nkey
),
val
)
if
err
!=
nil
{
return
err
}
err
=
from
.
Delete
(
fkey
)
if
err
!=
nil
{
return
err
}
}
fmt
.
Println
(
"Query done"
)
return
nil
}
func
moveIpfsDir
(
curpath
string
)
(
string
,
error
)
{
newpath
:=
strings
.
Replace
(
curpath
,
".go-ipfs"
,
".ipfs"
,
1
)
return
newpath
,
os
.
Rename
(
curpath
,
newpath
)
}
func
reverseIpfsDir
(
curpath
string
)
(
string
,
error
)
{
newpath
:=
strings
.
Replace
(
curpath
,
".ipfs"
,
".go-ipfs"
,
1
)
return
newpath
,
os
.
Rename
(
curpath
,
newpath
)
}
func
loadConfigJSON
(
repoPath
string
)
(
map
[
string
]
interface
{},
error
)
{
cfgPath
:=
path
.
Join
(
repoPath
,
"config"
)
fi
,
err
:=
os
.
Open
(
cfgPath
)
if
err
!=
nil
{
return
nil
,
err
}
var
out
map
[
string
]
interface
{}
err
=
json
.
NewDecoder
(
fi
)
.
Decode
(
&
out
)
if
err
!=
nil
{
return
nil
,
err
}
return
out
,
nil
}
func
saveConfigJSON
(
repoPath
string
,
cfg
map
[
string
]
interface
{})
error
{
cfgPath
:=
path
.
Join
(
repoPath
,
"config"
)
fi
,
err
:=
os
.
Create
(
cfgPath
)
if
err
!=
nil
{
return
err
}
out
,
err
:=
json
.
MarshalIndent
(
cfg
,
""
,
"
\t
"
)
if
err
!=
nil
{
return
err
}
_
,
err
=
fi
.
Write
(
out
)
if
err
!=
nil
{
return
err
}
return
nil
}
func
main
()
{
m
:=
migration
{}
migrate
.
Main
(
&
m
)
}
repo/fsrepo/migrations/mfsr.go
deleted
100644 → 0
浏览文件 @
c419a489
package
mfsr
import
(
"errors"
"fmt"
"io/ioutil"
"os"
"path"
"strings"
)
const
VersionFile
=
"version"
type
RepoPath
string
func
(
rp
RepoPath
)
VersionFile
()
string
{
return
path
.
Join
(
string
(
rp
),
VersionFile
)
}
func
(
rp
RepoPath
)
Version
()
(
string
,
error
)
{
if
rp
==
""
{
return
""
,
fmt
.
Errorf
(
"invalid repo path
\"
%s
\"
"
,
rp
)
}
fn
:=
rp
.
VersionFile
()
if
_
,
err
:=
os
.
Stat
(
fn
);
os
.
IsNotExist
(
err
)
{
return
""
,
errors
.
New
(
"no version file in repo at "
+
string
(
rp
))
}
c
,
err
:=
ioutil
.
ReadFile
(
fn
)
if
err
!=
nil
{
return
""
,
err
}
s
:=
string
(
c
)
s
=
strings
.
TrimSpace
(
s
)
return
s
,
nil
}
func
(
rp
RepoPath
)
CheckVersion
(
version
string
)
error
{
v
,
err
:=
rp
.
Version
()
if
err
!=
nil
{
return
err
}
if
v
!=
version
{
return
fmt
.
Errorf
(
"versions differ (expected: %s, actual:%s)"
,
version
,
v
)
}
return
nil
}
func
(
rp
RepoPath
)
WriteVersion
(
version
string
)
error
{
fn
:=
rp
.
VersionFile
()
return
ioutil
.
WriteFile
(
fn
,
[]
byte
(
version
+
"
\n
"
),
0644
)
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论