grim/convey
Clone
Summary
Browse
Changes
Graph
remove the old manual tests as we weren't running them anyways
redux
2021-12-18, Gary Kramlich
34da49589eac
remove the old manual tests as we weren't running them anyways
// Convey
// Copyright 2016-2019 Gary Kramlich <grim@reaperworld.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package
fs
import
(
"io"
"io/ioutil"
"os"
"path/filepath"
"strings"
log
"github.com/sirupsen/logrus"
)
// CopyFile copies the contents from src to dst atomically.
// If dst does not exist, CopyFile creates it with permissions perm.
// If the copy fails, copyFile aborts and dst is preserved.
func
copyFile
(
src
,
dst
string
,
perm
os
.
FileMode
)
error
{
in
,
err
:=
os
.
Open
(
src
)
if
err
!=
nil
{
return
err
}
defer
in
.
Close
()
tmp
,
err
:=
ioutil
.
TempFile
(
filepath
.
Dir
(
dst
),
""
)
if
err
!=
nil
{
return
err
}
_
,
err
=
io
.
Copy
(
tmp
,
in
)
if
err
!=
nil
{
tmp
.
Close
()
os
.
Remove
(
tmp
.
Name
())
return
err
}
if
err
=
tmp
.
Close
();
err
!=
nil
{
os
.
Remove
(
tmp
.
Name
())
return
err
}
if
err
=
os
.
Chmod
(
tmp
.
Name
(),
perm
);
err
!=
nil
{
os
.
Remove
(
tmp
.
Name
())
return
err
}
return
os
.
Rename
(
tmp
.
Name
(),
dst
)
}
func
copyDir
(
src
,
dst
string
,
perm
os
.
FileMode
)
error
{
absDst
,
err
:=
filepath
.
Abs
(
dst
)
if
err
!=
nil
{
return
err
}
dst
=
absDst
err
=
filepath
.
Walk
(
src
,
func
(
path
string
,
info
os
.
FileInfo
,
err
error
)
error
{
log
.
Debugf
(
"walk: path %q"
,
path
)
// make sure we're don't descend into our destination directory.
if
strings
.
HasPrefix
(
path
,
absDst
)
{
log
.
Debugf
(
"%q is in the destination %q"
,
path
,
absDst
)
return
nil
}
// at this point we're going to do something so we need to the real
// destination name
realDst
:=
filepath
.
Join
(
dst
,
strings
.
TrimPrefix
(
path
,
src
))
log
.
Debugf
(
"src %q; dst %q; realDst %q"
,
path
,
dst
,
realDst
)
// if path is a directory, create it
if
info
.
IsDir
()
{
err
:=
os
.
Mkdir
(
realDst
,
info
.
Mode
())
// this will get called with the root of the volume, so we need to
// handle the error if it exists.
if
os
.
IsExist
(
err
)
{
return
nil
}
return
err
}
// at this point we have a file so let's copy it
return
copyFile
(
path
,
realDst
,
info
.
Mode
())
})
return
err
}