►
From YouTube: Code Review Weekly Workshop - Mar 31, 2023
Description
In this session we discuss some code review topics and pair up on a code review.
00:00 Hello!
01:00 Finding who has approved when approvers are reset.
06:00 Let's review an MR
https://gitlab.com/gitlab-org/gitlab/-/merge_requests/112892
A
Well,
thanks
for
hopping
on
the
code
review
weekly
Workshop,
we
are
gonna
dive
into
some
topics
pertaining
to
code
review,
except
neither
Yannick
or
I.
Have
anything
to
talk
about
so
we're
gonna
pair
up
on
a
code
review.
Is
that
an
accurate
betrayal
of
the
situation.
B
It
is
very
much
so
full
stop
well.
A
Let
me
start
sharing
my
screen
before
I.
Do
that,
let
me
close
out
make
sure
I
don't
have
any
secrets
around
am.
B
I
dive
bomb
there's
another
short
question:
that's
just
coming
up
and
it
is
given
any
merge
request.
What
is
your
Technique
to
actually
check
or
like
on
a
quick
technique
to
actually
check
who
already
approved
this
asking
this
question,
because
she
likely
the
approved
by
section
that
we're
having
is
sometimes
lying
to
me
and
I'm.
Currently
looking
at
one
of
those
things
and
it
seems
like
it
is.
A
Yeah,
so
if
a
based
on
the
based
on
the
projects
rules,
it's
possible
that
a
code
owner
that
is
approved
is
reset
when
new
commits
have
been
pushed.
This.
C
A
A
Front
end
code
changes
the
back-end
maintainers
approval
should
still
be
relevant,
it
doesn't
need
to
be
review,
and
so
that's
really
up
to
the
front
end
maintainer
to
distinguish
that,
and
so
what
I'll
do
is
look
at.
The
commented
by
to
see
because,
like
most
likely
whoever's
approved,
has
left
the
comment,
and
so,
if
I
see
this
hasn't
even
been
commented
by
a
code
owner
for
Ruby
files,
then
this
hasn't
even
commented
by
a
code
owner
for
Ruby
files
and
it's
very
unlikely
it
was
approved.
A
A
B
Yeah
and
with
the
like,
the
the
control
F
approached
like,
let's
imagine
like
a
random
Mr
I
would
review
it.
I
would
approve
it
off.
I
would
still
make
some
other
changes,
and
my
approval
would
then
become
invalid.
With
the
there
would
be
like
a
log
entry
that
I
improved
this
thing,
but
there
is
no
entry
that,
like
this
approval,
has
none
now
go
go
out
of
state
or
whatever
it
is,
is.
B
A
Compare
the
changes
of
like
any
time
someone's
done,
a
big
rebase
I,
look
at
the
diff
of
this
diff
compared
to
last
Mr
diff
and
if
they're,
by
back
in
sometimes
there's
actually
back-end
changes
and
I
was
like.
Oh
well.
We
added
this
thing,
we'll
need
to
get
the
backend
maintainer
to
look
at
it
again,
and
so
you
do
have
to
sometimes
dive
into.
What's
actually
changed
between
an
approval
and
now
but.
B
Do
you
agree
I,
just
full
stop
I,
just
think
that
every
probably
like
the
these
things
coming
in
there
and
what
we're
seeing
on
the
left
is
basically
somewhat
of
a
timeline
like
all
the
the
comments
and
then
the
degrees
right
that
is
going
through.
This
there'll
probably
be
a
great
thing
that
we
actually
would
highlight
for
any
approval.
What
actually
has
been
approved.
B
A
Guess:
here's
the
little
icon!
You
can
look
for
it's
a
it's
very
little.
B
B
Sweet
okay,
that
was
that
was
helpful,
yeah
now
off
to
after
UMR
what'd
you
get.
A
A
A
So
the
target
branch
points
to
Source
Branch
points
to
a
non-default,
Target
branch,
and
so
this
is
a
different
Mr
and
then
this
one
is
just
iteratively
building
on
it,
which
is
a
great
thing,
but
one
of
the
things
that's
interesting
here
is
when
I
try
to
do
my.
A
B
Cool
yeah.
B
A
Yeah
doesn't
make
sense,
though
yep,
so
what
I'll
do
is
that's
when,
rather
than
working
on
top
of
Master
and
applying
changes
on
Master
I'll
actually
check
out
this
branch
and
then
apply
the
Mr
diff.
On
top
of
this
one,
so
I'll
actually
check
out
that.
B
C
A
Know
yep
I
mean,
and
so
it's
just
I
think
something
that
you
don't
realize
most
normal
Mrs
that
aren't
touching
other
branches.
Is
they
go
to
master,
and
so,
when
you're,
just
always
working
on
Master,
you
can
just
easily
just
push
everything
on
top
of
Master,
but
sometimes
you're
reviewing
NMR
that
doesn't
touch
Master
as
a
maintainer
I'm
not
going
to
merge
this
Mr.
This
is
just
reviewing
this
iteration
of
code
and
assuring
oh
yeah,
we're
all
good
the.
B
Problem
the
question
Christian
regarding
the
process
of
this,
like,
let's
imagine
for
a
second
changes
in
here,
are
all
looking
perfectly
fine
you'll.
It
gets
all
the
approvals
and
actually
gets
emerged
into
the
into
the
feature
Branch
listed
in
there.
B
Said
like
on
purpose
really:
let's
just
like:
let's
process
is
going
just
fine
everything's
perfectly
fine
and
let's
merge
it
into
the
other
feature.
Branch
listed
in
here.
This
feature,
Branch
I
suppose
will
get
get
or
should
be,
shall
get
merged
into
Master
someday.
Is
there
any
like
this?
Diff
will
be
huge?
Is
there
any
indication
that
the
changes
have
been
reviewed
before
so.
A
That's
a
really
good
question,
so
I
think
the
I
think
the
actual
approach
is
and
I
don't
know.
If
David
has
left
a
comment
about
this.
Okay
I'll
leave
a
comment
about
this,
and
so,
rather
than
merging
everything
into
a
big
feature,
branch
and
then
merging
that
feature
branch
which
which
I've
done
and
I
don't
recommend.
B
I
would
like
that
would
have
been
my
Approach
as
well
like
you
can
do
this
in,
like
as
kind
of
a
draft
mode.
Thingy,
yes
and
then
keep
on
rebasing
your
Mr,
that's
okay,
but
merging
them
all
together.
They
will
just
create
a
massive
if.
A
A
Is
the
preferred
way
of
of
handling
it
and,
as
the
Mr
author,
that
sets
up
a
chain
of
these
on
Mars
I'll
usually
have?
Let
me
see
if
I
can
just
find
an
example.
A
This
is,
this
is
probably
an
example.
Yeah
yeah,
so
I'll
usually
have
so
I
have
my
part,
one
Mr
and
then
part
two
points
to
part.
One
branch
point
three
points
part
two
Branch,
but.
C
B
A
Oh,
what
am
I
gonna
put,
what
do
I
put
oh
well,
I
can't
find
it,
but
anyways
I'll
usually
put
like
a
to-do.
Don't
merge
this
like
we
gotta
wait
for
this
other
thing
to
be
merged
and
we'll
rebase,
free
Target,
and
but
what
I
love
about
doing
it?
This
way
is
the
changes
are
cohesive
and
small
I'm
able
to
vertically
slice
my
iteration
so
I'm,
not
just
horizontally
slicing,
like
here's.
A
One
huge
component
deal
with
it,
I'm
able
to
see
how
everything
works
in
integration
but
grows
together,
but
I
can
get
these
reviewed
in
parallel.
I
love
that
and
that's
a
great
that's
a
great
productivity
boost
when,
if
I
put
all
of
these
into
one
Mr,
it
would
be
incredibly
daunting
and
it
would
take
a
long
time
for
someone
to
process
it
all
and
feel
okay
about
it.
But
if,
in
reality,
it's
three
straightforward
changes
which
someone
upon
looking
at
it
will
be
like.
Oh
yeah,
that's
great:
let's
do
it!
A
There's
just
wait
on
it,
and,
and
so
surprisingly,
I
could
see
how
splitting
up
in
Mars
sounds
like
a
lot
of
work,
but
it
really
helps
things.
Go
faster,
yeah,
awesome,
but.
B
Anyways
sorry
go
ahead:
no!
No!
What
we're
gonna
say,
reporting
that
I
have
not
yet
been
that
brave,
like
I
split
up
Mrs
I
built
Mr
chains,
but
for
the
reviews
then
I
would
kind
of
zerilize
the
reviews,
basically
being
like
okay,
let's
wait
until
this
thing
gets
approved
in
the
established
yet
but
yeah
you
can
with
a
couple
of
explanations,
you
can
probably
speed
us
up.
A
I
want
to
see
yeah
I
want
to
see
if
I
can
find
it
up.
I'm
gonna
see
if
I
can
find
another
one.
Let
me
see
if
this
this
one
might
be.
One
too.
This
is
on
the
web
ID
project
yeah.
It
was
only.
It
was
only
two
parts,
so
it's
not
a
good
example,
but
I'll
this
is
so.
This
is
actually
how
I
normally
do.
Things
is
I
create
one
gnarly
Mr
of
like
this
is
my
dream.
All
the
changes
I
want
to
make
and
then,
from
that
I
pull.
A
A
So
after
making
one
like
huge
gnarly
change,
I'll
I'll
iterate
over
that-
and
that's
that's
so
helpful
to
me,
because
I
really
need
to
see
it
all
sketched
out
kind
of
before
I
can
detail.
You.
A
Okay,
so
we're
on
this
we're
on
this
similar,
which
David,
if
you're
listening
it
would
have
been
cool
to
have
some
some
cross-reference
links
to
the
previous
Mr,
because
I
can't
seem
to
find
it.
But
that's
fine.
A
And
I
checked
out
the
stuff
locally
by
checking
out
the
target
branch
and
then
applying
the
changes
from
the
MR
here.
So
I
can
review
the
changes
which
I
love
doing
so.
One
of
the
suggestions
I
left
earlier
was
previously.
We
created
the
Apollo,
client
and
stuff
just
outside.
There
was
no
wrapping
function,
it
was
just
part
of
the
module
and
I
and
I
just
said:
hey
normally
like
we
try
not
to
use
side
effects
in
modules
on
import.
A
That's
a
great
question,
so
this
Mr-
this
is
the
back
end.
Stuff
isn't
done
for
this,
so
this
is
just
once
very
small
step
of
the
UI
to
hook
into
some
mock
data.
A
So
that's
where
you
see
it,
I
mean
this
is
some
really
interesting
code.
It's
like
this
is
like
test
code.
What's
it
doing
here,
but
it's
like
hey
this.
You
know
this
helps
build
out
the
front
end
in
parallel
and
very
iteratively,
along
with
the
back
end,
while
it's
all
under
a
feature
flag.
It's
like
yeah
put
in
mock
data.
That
sounds
helpful
right
uh-huh.
B
It's
yeah
I
do
I,
do
the
same
thing.
What
I
do
is
I,
usually
I,
don't
even
know
why
I
I
usually
don't
commit
mock
data,
but
what
I
do
is
provide
a
patch
to
values.
B
Yeah,
maybe
like
it
could
depend
on
the
use
case
whether
this
thing
is
possible
or
not,
but,
like
my
classic,
my
classic
use
case
is
there's
already
an
existing
endpoint,
but
it
will
be
from
the
back
end,
be
enhanced
with
with
like
a
super
set
of
data,
with
more
data
coming
in
that
we
usually
have
so
yeah
I
would
mock
this,
provide
a
patch
so
I'll
leave
the
the
existing
code
untouched
and
not
to
to
have
it
any
yeah,
not
too
little
or
anything
but
being
able
to
have
you
a
mock.
A
Gun
I
see
I
like
that
approach,
I'm
I
think
as
a
reviewer
like
I'm
fine,
either
way
if
a
team
wants
to
commit
mock
data
while
you're
building
it
out
and
if
that
is
helpful,
like
sure
like,
let's
go
for
it,
if
patches
are
more
helpful,
then
yeah,
let's
go
for
it.
Hatches
cannot.
Probably
I
could
see
how
that
may
allow
you
to
be
just
provide
so
much
data,
and
you
also
don't
need
those
patches
reviewed.
It's
like.
A
Oh,
we
changed
something
with
the
patch,
so
it's
like
here's
where
the
patch
lives
and
like
so
all
of
that
I
can
see
how
that
can
have
its
benefits,
but
see
kind
of.
Do
you
think
this
is
with
the
is
this
something
that
you
would
leave
up
to
the
author's
discretion
and
the
team's
discretion?
Or
is
it
something
that.
B
Yeah
yeah
I
would
I'm
not
too
sure
how
bold
I
would
want
to
have
a
comment
that
what
you're
currently
looking
at
is
mock
data
and
supposed
to
be
deleted,
like
this
is
attention
attention.
This
is
not
ready
for
for
protection,
and
that
might
be
something,
but
in
theory,
I'm
always
used
like
under
given
circumstances.
It's
okay
to
commit
mock
data.
Yeah
I
personally,
would
probably
agree
a
patch
because
I
don't
have
to
clean
up
afterwards.
That's
probably.
A
A
One
thing
with
this
file
that
I'm
noticing
so
related
to
the
mock
data.
A
So
this
is
round
two
of
the
review
and
I'm,
anticipating
that
this
is
all
gonna
be
okay,
but
on
The
View
component
itself,
pagination
was
implemented
a
little
I,
don't
know
if
it
was
actually
gonna
work
and,
as
you
can
see
in
our
mock
data,
we're
only
returning
one
item.
So
it's
not
like.
A
We
even
had
the
mock
data
to
test
out
pagination,
so
I
kind
of
just
suggested
with
this
at
this
level,
let's
just
remove
pagination
until
we
can
actually
test
it
out,
but
I
see
that
the
page
info.
A
Part
of
the
data
has
been
left
behind,
so
it's
not
part
of
the
query
anymore,
but
it
is
part
of
the
the
data
which
this
is
not
a
big
deal,
because
this
is
all
tests
code.
At
this
point,
and
as
long
as
it
doesn't
just
totally
break
things
and
make
things
inconvenient.
A
A
Something
like
that,
all
right,
let
me
go
ahead
and
start
the
GDK
so
I
can
we
can
test
this
out
all
right.
There's
our
cool
little
Quarry.
A
Let's
look
at
the
template
first,
so
we
have
an
alert.
If
there's
an
error
message
dismissing
goes
to
clearing
the
error
message
boom
workspace
as
an
empty
state.
If
we
don't
have
any
workspaces,
we're
going
to
show
the
empty
State
else,
this
means.
If
we
do
have
workspaces,
then
we
show
our
little
header
and
if
we're
loading.
B
You
want
me
to
say
something
that
yes
made
me
raise
an
eyebrow
yes
and
995,
the
D
minus
2x
class.
What's
that
going
to
be.
A
We'll
have
that's
a
good
call.
I
I
want
to
oh
flip-flops
I.
Don't
know
why
it's
telling
me
I
want
to
learn
the
basics
of
git
I'm
a
software
developer,
but
I
want
to
learn
git
cool.
A
C
C
B
B
Okay!
No!
So
it's
only
only
the
heading
in
one
container
with
the
table
underneath
so
yeah
you
can
give
it
a
flex,
but
you
can
also
not
give
it
a
flex
like
it
doesn't
really
yeah.
A
B
A
To
try
not
to
use
bootstrap
utility
classes
like
the
flex
looks
like
all
of
these
classes
might
not
be
needed.
C
C
C
A
Okay,
one
interesting
thing
I'm
noticing
is
that
we
won't
be
showing
the
loader
unless
we
have
workspaces.
A
Right
I
want
to
I
want
to
force
the
loading
state
somehow.
A
B
They'll,
probably
be
painful,
I
would
argue,
the
updating
state
in
there
is
not,
let's
see
yeah
I
was
expecting
it.
I
I
hate
it
like
somewhere,
really
really
really
at
the
back
of
my
head.
I
feel
like
it
is
possible
just.
C
B
A
Right,
that's
what
I
do,
let's,
let's
do
this,
then,
let's
I'm
gonna,
just
open
up
this
file
now.
A
All
right,
that's
not
how
code
works
okay,
so
let
me
replace
the
apollo.loading
thing
with:
is
loading
and
see
what
happens.
B
A
B
I
do
agree,
I
would
need
to
double
check.
Like
reason
reason
just
is
making
me
laugh,
is
I
recently
had
a
problem.
I
try
to
solve
where
it's
real
table
light
actually
was
the
solution
for
and
I
asked
and
gitlab
UI
and
people
pointed
me
to
to
your
table
light,
which
I
did
not
have
on
top
of
my
hand,
but
it
turns
out
like
a
year
ago
or
something
I
actually
introduced
this
component,
so
that
was
yeah.
That
was
kind
of
funny.
Oh.
C
A
Right,
I'm
gonna,
so
we're
gonna
have
so
what
I'm
changing
right
now
is.
We
need
to
rather
than
testing
has
workspaces
here.
I
think
we
test
if
we're
empty
and
empty
needs
to
include.
We
don't
have
any
workspaces
and
we're
not
loading.
C
A
A
C
B
Did
I
do
not
rendering
something?
Let's
let's
reach.
B
They're
not
even
rendering
the
headline,
aren't
we
so
the
wait,
what
it
is
empty,
but
if
there's
no
headline,
then
we
would
be
playing
in
line
95,
yeah
95.
Isn't
it.
B
Can
we
can
we
see
this
component
in
the
in
the
view
inspector
or
say
any
error
on
the
console.
C
A
B
This,
oh.
A
C
A
Nice
there's
a
cool
setting.
You
can
set
there.
A
All
right,
let
me
let
me
take
a
screenshot
of
this
and
that's
kind
of
maybe
a
question
to
ask,
but
then
let
me
change
this
back
to
I
gotta
go
this
apollo.loading.
A
Okay
boom
and
we're
back
and
so
then
to
test
the
other
state.
If
we
don't
have
any
of
this
stuff.
C
B
C
A
C
B
Prop,
let
me
create
a
double
check
that.
B
Yeah
good
call,
I
mean
I
took
a
wrong
turn.
You're
you're
faster
than
me.
A
B
table
light
here
it
is
properties
if
I
J,
K
L,
there's
no
l.
C
C
C
A
Do
we
need
ux
here
it's
my
question:
does
that
sound
good,
okay,
cool
one
last
thing
that
I'm
I'm
seeing
Also?
Let's
keep
going,
we
were
here
so
we
pass
in
the
fields
and
we
have
the
items
we
saw
that
that
works,
and
then
here's
these
different
templates
looks
like
when
we
man
yeah.
If
you
weren't
here,
I
was
just
blowing
through
the
utility
classes.
I
wasn't
even
looking
at
them.
A
C
B
A
I
think
we
actually
just
put
it
in
here
like
this.
What
do
you
think.
B
No
I
think
I
like
the
first
version
better
but
I'm,
fine
yeah
but
I'm
trying
to
find
an
argument
to
and
I
can't
really
can't
really
think
of.
One.
A
C
A
C
A
Guess
so
what
I
found
yay
I
guess
so?
Okay,
yeah
all
right
to
me:
it's
not
a
big
deal
and
we
don't
have
to
fix
it
here,
but
I
would
just
oh
man.
I
went
back
too
far,
I'm
just
gonna
undo
all
my
changes
but
I'm
either
not
going
to
make
a
change
I'm
just
going
to
ask
I'm
just
gonna.
Do
a
little
non-blocking
Polish
thing
of
this
method
actually
doesn't
have
anything
to
do
with.
A
Okay,
great
so
moving
on,
we
renamed
this
spec
we
put
in
a
different
folder
to
align
with
the
component,
and
then
here
is
the
spec
for
the
list
that
we
have
so
looking
at
the
spec
that
we
have
here
empty
state
with
no
workspace
service
shows
the
table
when
workspaces
are
available,
displays
user
workspaces
correctly
row
find
component,
ahrefs
and
stuff.
C
B
Okay,
I,
don't
yeah
nothing,
nothing
to
to
mention
from
my
side
anymore
other
than
the
single
mentioned.
A
Okay
sounds
good
I'm
gonna
test
out
the
the
coverage
of
this.
A
So
let
me
close
this
out
by
removing
some
template
stuff
and
seeing
what
happens.
Good
good
call,
good
call.
That's
that's!.
B
But
I
do
have
the
same
question
on
my
revenues:
I,
usually
really
not
not
necessarily
line
by
line
but
kind
of
have
like
tests
and
codes
next
to
each
other
and
check
what
is
actually
being
covered
just
more
or
less
randomly
removing
things
seems
much
more
efficient
and
waiting.
A
A
Yeah,
there's
a
lot
of
uncovered.
There's
a
lot
of
there's
a
lot
of
ways
that
we
can.
We
can
approach
this
I'm
wanting
to
I'm
wanting
to
to
not
be
neurotic
I
can
get
neurotic
about
it,
and
so,
knowing
that
about
myself,
I'm
trying
to
think
what
would
well
with
someone
who's
not
neurotic
do
and
I'm
hitting
a
wall,
but
one
of
the
things
I'm
tempted
to
want
to
leave.
So
to
me
all
right.
Let's,
let's
go
way
back.
A
The
template
is
a
great
place
to
start
with
what
is
covered
in
intestine
or
and
not
in
view
components.
So
that's
all
great.
A
C
A
This
is
what
we
expect
from
this
one
we're
going
to
find
this
component,
and
so
then
I
have
like
an
object
that
it
pulls
from
each
one
of
the
rows.
So
I
end
up
with
like
an
array
and
I
can
actually
just
say,
find
table
rows
as
data
equals
mock
group
workspace
nodes
or
something
like
that,
so
it's
like
I
rather
than
just
saying
oh,
was
the
text
contained
at
all,
but
I
think
this
is
fine.
Well,
actually
now
I'm
looking
at
it.
Oh,
we
don't
usually
do
expectations
in
like
Loops
like
this.
A
Oh
yeah,
yeah,
yeah,
so
I
think
I
am
going
to
suggest
that
we
do
this
thing
as
well
all
right
and
then
and
then
we'll.
Then
it's
time
to
go
well,
it
might
be
time
to
go
right
now.
What
do
you
think?
Do
you
get
a
head
to
pairing
time?
Probably
do
we
gotta
be
on
time
for
meetings?
It's
important
yeah.